While women and men are the same species, we are actually not the same. Due to the inherent differences in physical structures between male and female, roles have been defined and redefined over time. Generally, male and female could have distinguished points of view of understanding on same issue. When it comes to daily life, this gender difference still plays an significant role. We experience various mood and feelings every day. Will gender difference plays an effect on our mood? To be more specific, how will gender affect our happy moments every day? Is there a difference between female and male on happiness sources? This project will analyze this gender effect on happy moments based on the HappyDB dataset.
Let’s check out whether there exist difference in daily happy moments between female and male.
Overview of happy moments between female and male
Word Cloud
# Overall Female Word Cloud
wordcloud(female_word_count$word, female_word_count$n,
scale=c(3,0.2),
max.words = 100,
min.freq = 1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9, "Set1"))

# Overall Male Word Cloud
wordcloud(male_word_count$word, male_word_count$n,
scale=c(3,0.2),
max.words = 100,
min.freq = 1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9, "Set1"))

Each word cloud graph contains 100 high frequency words appeared in participants responses on happy moments. They represent that the top 3 word for both female and male are “friend”, “time” and “day”. The reasons behind are not hard to guess – we value friendship and social bonding. Besides “friend”, there are words like “family”, “husband”, “wife”…also stand out, which indicates family relations are also important in happiness for both female and male. Let’s look at the bar plots for exact frequency for top words.
Bar Plot
# Top 10 words bar plots for female and male
fb <- ggplot(data = female_word_count[1:10, ], aes(x = reorder(word,n), y = n)) +
geom_bar(stat = "identity") +
coord_flip()
mb <- ggplot(data = male_word_count[1:10, ], aes(x = reorder(word,n), y = n)) +
geom_bar(stat = "identity") +
coord_flip()
grid.arrange(fb, mb)

The bar plots shows us relatively specific frequency for top words. We could see that “friend” is the top 1 word for male participants with more than 6000 occurrences. Family member words such as “daughter” and “son” appear more frequent in female participants’ happy moments. While for male participants, “watched” and “game” are more frequent words. Based on these plots, we could reasonable guess that for female and male there probably exists different sources of happy moments. With the help of LDA, a topic modeling algorithm, we would be able to figure out what are the main topics for happy moments of female and male. Let’s check out the results!
Are there any differences in happiness sources between female and male??
# Define LDA process function
LDA_process <- function(data, obj_name){
corpus <- Corpus(VectorSource(data))%>%
tm_map(content_transformer(tolower))%>%
tm_map(removePunctuation)%>%
tm_map(removeNumbers)%>%
tm_map(removeWords, c(stopwords("english"),"happy","ago","yesterday","lot","today","months","month",
"happier","happiest","last","week","past"))%>%
tm_map(stripWhitespace)
stem <- tm_map(corpus, stemDocument)
dtm <- DocumentTermMatrix(stem)
rowTotals <- apply(dtm , 1, sum) #Find the sum of words in each Document
dtm <- dtm[rowTotals> 0, ]
#Set parameters for Gibbs sampling
burnin <- 4000
iter <- 2000
thin <- 500
seed <-list(2003,5,63,100001,765)
nstart <- 5
best <- TRUE
#Number of topics
k <- 8
#Run LDA using Gibbs sampling
ldaOut <-LDA(dtm, k, method="Gibbs", control=list(nstart=nstart,
seed = seed, best=best,
burnin = burnin, iter = iter,
thin=thin))
#write out results
#docs to topics
ldaOut.topics <- as.matrix(topics(ldaOut))
write.csv(ldaOut.topics, file = paste("../output/", obj_name,"_DocsToTopics.csv", sep = ""))
#top terms in each topic
ldaOut.terms <- as.matrix(terms(ldaOut, 20))
write.csv(ldaOut.terms, file = paste("../output/", obj_name, "_TopicsToTerms.csv", sep = ""))
# probabilities associated with each topic assignment
topicProbabilities <- as.data.frame(ldaOut@gamma)
write.csv(topicProbabilities, file = paste("../output/", obj_name, "_TopicProbabilities.csv", sep = ""))
return(list(ldaOut.terms, topicProbabilities))
}
female_topics <- LDA_process(female_hm$cleaned_hm, "Female")
transformation drops documentstransformation drops documentstransformation drops documentstransformation drops documentstransformation drops documents
female_topics.hash <- c("Shopping", "Life Moments", "Special Days Celebration","Family","Partner", "Others", "Friends/Children/Relatives Achievements", "Outdoor Activities")
male_topics.hash <- c("Special Days Celebration","Life Moments","Outdoor Activities","Others","Leisure", "Family", "Work Achievements", "Habits")
names(female_topicProbabilities) <- female_topics.hash
names(male_topicProbabilities) <- male_topics.hash
By setting the number of topics to 8 in advance and then run LDA using Gibbs sampling, the terms from happy moment sentences were grouped in to 8 groups and each group represent a topic.
Based on my understanding of the terms, I categorized the topics as the following.
Female:
Topic1: Shopping
Topic2: Life Moments
Topic 3: Special Days Celebration
Topic 4: Family
Topic 5: Partner
Topic 6: Others
Topic 7: Friends/Children/Relatives Achievements
Topic 8: Outdoor Activities
Male:
Topic 1: Special Days Celebration
Topic 2: Life Moments
Topic 3: Outdoor Activities
Topic 4: Others
Topic 5: Leisure
Topic 6: Family
Topic 7: Work Achievements
Topic 8: Habits
Comparing with topic results we got from topic modelling, there are several common topics for female and male[Life Moments, Special Days Celebration, Family, Outdoor Activities and Others]. These common topics are reasonable. “Family” for example, could give us strong support and love so that it can provide humans with great happiness with not doubt. Except for these common topics, female tend to gain happiness from “Shopping”, “Partner” and “Friends/Children/Relatives Achievements” while male tend to gain happiness from “Leisure”, “Work Achievements” and “Habits”. The different sources for happiness arise and let’s move on to find out more details about the difference.
While female and male gain happiness from relatively different sources, which type of sources would be more general? In other words, which are hot happy topics for female and male?
Among these happy sources, which is more common?
# generate heatmap for female
heatmap.2(as.matrix(female_topicProbabilities[sample(1:nrow(female_topicProbabilities), 20), ]), Rowv = FALSE,
scale = "row", key = F,
col = bluered(100),
cexRow = 0.5,
cexCol = 0.9,
margins = c(8,8),
trace = "none",
density.info = "none")

# generate heatmap for male
heatmap.2(as.matrix(male_topicProbabilities[sample(1:nrow(male_topicProbabilities), 20),]), Rowv = FALSE,
scale = "row", key = F,
col = bluered(100),
cexRow = 0.5,
cexCol = 0.9,
margins = c(8,8),
trace = "none",
density.info = "none")

I randomly picked 20 responses from each group(female and male) and plotted heat maps. Red color indicates the happy moment is more related to that topic. Based on the heatmap for female, we could easily notice that the topic “Partner” has the most blocks of red and then “Shopping” and “Family”. This result shows that in general, female tend to obtain much happiness from their partner(boyfriend, husband). This is reasonable since the different physical structures between female and male lead to generally different sensitivity to emotions. Female tends to be more sensitive in emotion and thus this is the probable reason why intimate relations would play significant role. In this case, intimate relations could be a more general happiness source than others. Other than “Partner”, going for shopping and spending time with family can also be two common sources of happiness for female.
For male, “Leisure” is the most common happy source. Indeed, leisure time such as spend a day with no work at home and get good rest tend to be really relaxing, especially for male. Besides, doing something they like(Habits), joining outdoor activities(Outdoor Activities) and accomplish some goals at word( Work Achievements) are also popular happiness sources for male.
Do happy topics different among different age ranges for female and male?
While you may also be interested in whether people with different age tends to gain happiness from different topics. Would this be true for both female and male??
Cluster Topics by Age for Female
# Cluster topics by age for female
female_cluster_data <- as.matrix(age_female_topicProbabilities[,-1])
rownames(female_cluster_data) <- age_female_topicProbabilities[,1]
female_fit <- kmeans(female_cluster_data, iter.max = 200, 4)
fviz_cluster(female_fit,
stand = F,
repel = TRUE,
data = female_cluster_data,
xlab = "", ylab = "", xaxt = "n",
show.clust.cent = FALSE)

Cluster Topics by Age for Male
# Data formatting and preparation
# correct typing errors
male_hm[which(male_hm$age == "2" | male_hm$age == "2.0"), ]$age <- "20"
male_hm[which(male_hm$age == 3), ]$age <- 30
# format age to numbers only (eg 30 instead of 30.0)
male_hm$age <- substr(male_hm$age, 1, 2)
age_male_topicProbabilities <- cbind(male_topicProbabilities, male_hm$age[-1])
colnames(age_male_topicProbabilities)[ncol(age_male_topicProbabilities)] <- "age"
age_male_topicProbabilities<-aggregate(male_topicProbabilities[1:8], list(age_male_topicProbabilities$age), mean)
# Cluster topics by age for male
male_cluster_data <- as.matrix(age_male_topicProbabilities[,-1])
rownames(male_cluster_data) <- age_male_topicProbabilities[,1]
male_fit <- kmeans(male_cluster_data, iter.max = 200, 4)
fviz_cluster(male_fit,
stand = F,
repel = TRUE,
data = male_cluster_data,
xlab = "", ylab = "", xaxt = "n",
show.clust.cent = FALSE)

Based on the clustering result for female, we could clearly notice there are four clusters and there is a small overlap between two clusters. For cluster 1, it contains mostly points with younger age. The cluster 2 contains age with most points belongs to 40s, 50s and 60s. While for the cluster result for male, the overlap is a serious issue, which indicates that there is not a clear difference in happy topics for male with different age range.
Do happy topics different among different regions for female and male?
country_female_topicProbabilities <- cbind(female_topicProbabilities, countrycode(sourcevar = female_hm$country, "iso3c", "country.name"))
colnames(country_female_topicProbabilities)[ncol(country_female_topicProbabilities)] <- "country"
country_female_topicProbabilities<-aggregate(country_female_topicProbabilities[1:8], list(country_female_topicProbabilities$country), mean)
# Cluster topics by country for female
female_cluster_data <- as.matrix(country_female_topicProbabilities[,-1])
rownames(female_cluster_data) <- country_female_topicProbabilities[,1]
female_fit <- kmeans(female_cluster_data, iter.max = 200, nstart = 5,5)
fviz_cluster(female_fit,
stand = F,
repel = TRUE,
data = female_cluster_data,
xlab = "", ylab = "", xaxt = "n",
show.clust.cent = FALSE)

country_male_topicProbabilities <- cbind(male_topicProbabilities, countrycode(sourcevar = male_hm$country, "iso3c", "country.name")[-1])
colnames(country_male_topicProbabilities)[ncol(country_male_topicProbabilities)] <- "country"
country_male_topicProbabilities<-aggregate(country_male_topicProbabilities[1:8], list(country_male_topicProbabilities$country), mean)
# Cluster topics by country for male
male_cluster_data <- as.matrix(country_male_topicProbabilities[,-1])
rownames(male_cluster_data) <- country_male_topicProbabilities[,1]
male_fit <- kmeans(male_cluster_data, iter.max = 200, nstart = 5,5)
fviz_cluster(male_fit,
stand = F,
repel = TRUE,
data = male_cluster_data,
xlab = "", ylab = "", xaxt = "n",
show.clust.cent = FALSE)

How about happy moments for female male from different regions? The clustering results shows that there is no obvious happy source difference for both female and male.
LS0tCnRpdGxlOiAiR2VuZGVyIEVmZmVjdCBvbiBIYXBweSBNb21lbnRzIEFuYWx5c2lzIgphdXRob3I6ICJZdW5mYW4gTGkgeWwzODM4IgpvdXRwdXQ6CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKLS0tCgpXaGlsZSB3b21lbiBhbmQgbWVuIGFyZSB0aGUgc2FtZSBzcGVjaWVzLCB3ZSBhcmUgYWN0dWFsbHkgbm90IHRoZSBzYW1lLiBEdWUgdG8gdGhlIGluaGVyZW50IGRpZmZlcmVuY2VzIGluIHBoeXNpY2FsIHN0cnVjdHVyZXMgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUsIHJvbGVzIGhhdmUgYmVlbiBkZWZpbmVkIGFuZCByZWRlZmluZWQgb3ZlciB0aW1lLiBHZW5lcmFsbHksIG1hbGUgYW5kIGZlbWFsZSBjb3VsZCBoYXZlIGRpc3Rpbmd1aXNoZWQgcG9pbnRzIG9mIHZpZXcgb2YgdW5kZXJzdGFuZGluZyBvbiBzYW1lIGlzc3VlLiBXaGVuIGl0IGNvbWVzIHRvIGRhaWx5IGxpZmUsIHRoaXMgZ2VuZGVyIGRpZmZlcmVuY2Ugc3RpbGwgcGxheXMgYW4gc2lnbmlmaWNhbnQgcm9sZS4gV2UgZXhwZXJpZW5jZSB2YXJpb3VzIG1vb2QgYW5kIGZlZWxpbmdzIGV2ZXJ5IGRheS4gV2lsbCBnZW5kZXIgZGlmZmVyZW5jZSBwbGF5cyBhbiBlZmZlY3Qgb24gb3VyIG1vb2Q/IFRvIGJlIG1vcmUgc3BlY2lmaWMsIGhvdyB3aWxsIGdlbmRlciBhZmZlY3Qgb3VyIGhhcHB5IG1vbWVudHMgZXZlcnkgZGF5PyAgSXMgdGhlcmUgYSBkaWZmZXJlbmNlIGJldHdlZW4gZmVtYWxlIGFuZCBtYWxlIG9uIGhhcHBpbmVzcyBzb3VyY2VzPyBUaGlzIHByb2plY3Qgd2lsbCBhbmFseXplIHRoaXMgZ2VuZGVyIGVmZmVjdCBvbiBoYXBweSBtb21lbnRzIGJhc2VkIG9uIHRoZSBIYXBweURCIGRhdGFzZXQuIAoKTGV04oCZcyBjaGVjayBvdXQgd2hldGhlciB0aGVyZSBleGlzdCBkaWZmZXJlbmNlIGluIGRhaWx5IGhhcHB5IG1vbWVudHMgYmV0d2VlbiBmZW1hbGUgYW5kIG1hbGUuCgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeShEVCkKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkod29yZGNsb3VkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShncmlkKQpsaWJyYXJ5KG5ncmFtKQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHRvcGljbW9kZWxzKQpsaWJyYXJ5KGdwbG90cykKbGlicmFyeShmYWN0b2V4dHJhKQpsaWJyYXJ5KGNvdW50cnljb2RlKQoKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiMgRGF0YSBQcmVwYXJhdGlvbgoKaG1fZGF0YSA8LSByZWFkX2NzdigiL1VzZXJzL3l1bmZhbmxpL0RvY3VtZW50cy9HaXRIdWIvRmFsbDIwMTgtUHJvajEteXVuZmFubGk5Ny9vdXRwdXQvcHJvY2Vzc2VkX21vbWVudHMuY3N2IikKYmFnX29mX3dvcmRzIDwtIHJlYWRfY3N2KCIvVXNlcnMveXVuZmFubGkvRG9jdW1lbnRzL0dpdEh1Yi9GYWxsMjAxOC1Qcm9qMS15dW5mYW5saTk3L291dHB1dC9iYWdfb2Zfd29yZHMuY3N2IikKd29yZF9jb3VudCA8LSByZWFkX2NzdigiL1VzZXJzL3l1bmZhbmxpL0RvY3VtZW50cy9HaXRIdWIvRmFsbDIwMTgtUHJvajEteXVuZmFubGk5Ny9vdXRwdXQvd29yZF9jb3VudC5jc3YiKQoKIyMgU3BsaXQgbWFsZSBhbmQgZmVtYWxlIGRhdGEKCmZlbWFsZV9obSA8LSBobV9kYXRhW3doaWNoKGhtX2RhdGEkZ2VuZGVyID09ICJmIiksIF0KbWFsZV9obSA8LSBobV9kYXRhW3doaWNoKGhtX2RhdGEkZ2VuZGVyID09ICJtIiksIF0KCmZlbWFsZS5pIDwtIHdoaWNoKGJhZ19vZl93b3JkcyRnZW5kZXIgPT0gImYiKQoKZmVtYWxlX3dvcmRzIDwtIGJhZ19vZl93b3Jkc1tmZW1hbGUuaSwgXQptYWxlX3dvcmRzIDwtIGJhZ19vZl93b3Jkc1stZmVtYWxlLmksIF0KCmZlbWFsZV93b3JkX2NvdW50IDwtICBmZW1hbGVfd29yZHMgJT4lCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpCm1hbGVfd29yZF9jb3VudCA8LSBtYWxlX3dvcmRzICU+JQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQoKCmBgYAoKCmBgYHtyIGVjaG89VFJVRX0KIyBGZW1hbGUgRGF0YSAKZmVtYWxlX2htCmBgYAoKCmBgYHtyIGVjaG89VFJVRX0KIyBNYWxlIERhdGEKbWFsZV9obQpgYGAKCgoKCiMgT3ZlcnZpZXcgb2YgaGFwcHkgbW9tZW50cyBiZXR3ZWVuIGZlbWFsZSBhbmQgbWFsZQoKIyMjIFdvcmQgQ2xvdWQKYGBge3IgZWNobz1UUlVFfQojIE92ZXJhbGwgRmVtYWxlIFdvcmQgQ2xvdWQgCndvcmRjbG91ZChmZW1hbGVfd29yZF9jb3VudCR3b3JkLCBmZW1hbGVfd29yZF9jb3VudCRuLAogICAgICAgICAgc2NhbGU9YygzLDAuMiksCiAgICAgICAgICBtYXgud29yZHMgPSAxMDAsCiAgICAgICAgICBtaW4uZnJlcSA9IDEsCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsCiAgICAgICAgICByb3QucGVyPTAuMywKICAgICAgICAgIHVzZS5yLmxheW91dD1ULAogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoOSwgIlNldDEiKSkKCmBgYAoKYGBge3IgZWNobz1UUlVFfQojIE92ZXJhbGwgTWFsZSBXb3JkIENsb3VkIAp3b3JkY2xvdWQobWFsZV93b3JkX2NvdW50JHdvcmQsIG1hbGVfd29yZF9jb3VudCRuLAogICAgICAgICAgc2NhbGU9YygzLDAuMiksCiAgICAgICAgICBtYXgud29yZHMgPSAxMDAsCiAgICAgICAgICBtaW4uZnJlcSA9IDEsCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsCiAgICAgICAgICByb3QucGVyPTAuMywKICAgICAgICAgIHVzZS5yLmxheW91dD1ULAogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoOSwgIlNldDEiKSkKCmBgYAoKCkVhY2ggd29yZCBjbG91ZCBncmFwaCBjb250YWlucyAxMDAgaGlnaCBmcmVxdWVuY3kgd29yZHMgYXBwZWFyZWQgaW4gcGFydGljaXBhbnRzIHJlc3BvbnNlcyBvbiBoYXBweSBtb21lbnRzLiBUaGV5IHJlcHJlc2VudCB0aGF0IHRoZSB0b3AgMyB3b3JkIGZvciBib3RoIGZlbWFsZSBhbmQgbWFsZSBhcmUg4oCcZnJpZW5k4oCdLCDigJx0aW1l4oCdIGFuZCDigJxkYXnigJ0uIFRoZSByZWFzb25zIGJlaGluZCBhcmUgbm90IGhhcmQgdG8gZ3Vlc3Mg4oCTIHdlIHZhbHVlIGZyaWVuZHNoaXAgYW5kIHNvY2lhbCBib25kaW5nLiAgQmVzaWRlcyDigJxmcmllbmTigJ0sICB0aGVyZSBhcmUgd29yZHMgbGlrZSDigJxmYW1pbHnigJ0sIOKAnGh1c2JhbmTigJ0sIOKAnHdpZmXigJ3igKZhbHNvIHN0YW5kIG91dCwgd2hpY2ggaW5kaWNhdGVzIGZhbWlseSByZWxhdGlvbnMgYXJlIGFsc28gIGltcG9ydGFudCBpbiBoYXBwaW5lc3MgZm9yIGJvdGggZmVtYWxlIGFuZCBtYWxlLiBMZXTigJlzIGxvb2sgYXQgdGhlIGJhciBwbG90cyBmb3IgZXhhY3QgZnJlcXVlbmN5IGZvciB0b3Agd29yZHMuCgoKIyMjIEJhciBQbG90CgpgYGB7ciBlY2hvPVRSVUV9CgojIFRvcCAxMCB3b3JkcyBiYXIgcGxvdHMgZm9yIGZlbWFsZSBhbmQgbWFsZQpmYiA8LSBnZ3Bsb3QoZGF0YSA9IGZlbWFsZV93b3JkX2NvdW50WzE6MTAsIF0sIGFlcyh4ID0gcmVvcmRlcih3b3JkLG4pLCB5ID0gbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGNvb3JkX2ZsaXAoKQoKbWIgPC0gZ2dwbG90KGRhdGEgPSBtYWxlX3dvcmRfY291bnRbMToxMCwgXSwgYWVzKHggPSByZW9yZGVyKHdvcmQsbiksIHkgPSBuKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgY29vcmRfZmxpcCgpCmdyaWQuYXJyYW5nZShmYiwgbWIpCmBgYAoKVGhlIGJhciBwbG90cyBzaG93cyB1cyByZWxhdGl2ZWx5IHNwZWNpZmljIGZyZXF1ZW5jeSBmb3IgdG9wIHdvcmRzLiBXZSBjb3VsZCBzZWUgdGhhdCDigJxmcmllbmTigJ0gaXMgdGhlIHRvcCAxIHdvcmQgZm9yIG1hbGUgcGFydGljaXBhbnRzIHdpdGggbW9yZSB0aGFuIDYwMDAgb2NjdXJyZW5jZXMuIEZhbWlseSBtZW1iZXIgd29yZHMgc3VjaCBhcyDigJxkYXVnaHRlcuKAnSBhbmQg4oCcc29u4oCdIGFwcGVhciBtb3JlIGZyZXF1ZW50IGluIGZlbWFsZSBwYXJ0aWNpcGFudHPigJkgaGFwcHkgbW9tZW50cy4gV2hpbGUgZm9yIG1hbGUgcGFydGljaXBhbnRzLCDigJx3YXRjaGVk4oCdIGFuZCDigJxnYW1l4oCdIGFyZSBtb3JlIGZyZXF1ZW50IHdvcmRzLiBCYXNlZCBvbiB0aGVzZSBwbG90cywgd2UgY291bGQgcmVhc29uYWJsZSBndWVzcyB0aGF0IGZvciBmZW1hbGUgYW5kIG1hbGUgdGhlcmUgcHJvYmFibHkgZXhpc3RzIGRpZmZlcmVudCBzb3VyY2VzIG9mIGhhcHB5IG1vbWVudHMuIFdpdGggdGhlIGhlbHAgb2YgTERBLCBhIHRvcGljIG1vZGVsaW5nIGFsZ29yaXRobSwgd2Ugd291bGQgYmUgYWJsZSB0byBmaWd1cmUgb3V0IHdoYXQgYXJlIHRoZSBtYWluIHRvcGljcyBmb3IgaGFwcHkgbW9tZW50cyBvZiBmZW1hbGUgYW5kIG1hbGUuIExldOKAmXMgY2hlY2sgb3V0IHRoZSByZXN1bHRzIQoKCgojIEFyZSB0aGVyZSBhbnkgZGlmZmVyZW5jZXMgaW4gaGFwcGluZXNzIHNvdXJjZXMgYmV0d2VlbiBmZW1hbGUgYW5kIG1hbGU/PwoKYGBge3J9CiMgRGVmaW5lIExEQSBwcm9jZXNzIGZ1bmN0aW9uCkxEQV9wcm9jZXNzIDwtIGZ1bmN0aW9uKGRhdGEsIG9ial9uYW1lKXsKCiAgY29ycHVzIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoZGF0YSkpJT4lCiAgICB0bV9tYXAoY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSklPiUKICAgIHRtX21hcChyZW1vdmVQdW5jdHVhdGlvbiklPiUKICAgIHRtX21hcChyZW1vdmVOdW1iZXJzKSU+JQogICAgdG1fbWFwKHJlbW92ZVdvcmRzLCBjKHN0b3B3b3JkcygiZW5nbGlzaCIpLCJoYXBweSIsImFnbyIsInllc3RlcmRheSIsImxvdCIsInRvZGF5IiwibW9udGhzIiwibW9udGgiLAogICAgICAgICAgICAgICAgICJoYXBwaWVyIiwiaGFwcGllc3QiLCJsYXN0Iiwid2VlayIsInBhc3QiKSklPiUKICAgIHRtX21hcChzdHJpcFdoaXRlc3BhY2UpCgogIHN0ZW0gPC0gdG1fbWFwKGNvcnB1cywgc3RlbURvY3VtZW50KQogIGR0bSA8LSBEb2N1bWVudFRlcm1NYXRyaXgoc3RlbSkKICAKICByb3dUb3RhbHMgPC0gYXBwbHkoZHRtICwgMSwgc3VtKSAjRmluZCB0aGUgc3VtIG9mIHdvcmRzIGluIGVhY2ggRG9jdW1lbnQKCiAgZHRtICA8LSBkdG1bcm93VG90YWxzPiAwLCBdCiAgCiAgI1NldCBwYXJhbWV0ZXJzIGZvciBHaWJicyBzYW1wbGluZwogIGJ1cm5pbiA8LSA0MDAwCiAgaXRlciA8LSAyMDAwCiAgdGhpbiA8LSA1MDAKICBzZWVkIDwtbGlzdCgyMDAzLDUsNjMsMTAwMDAxLDc2NSkKICBuc3RhcnQgPC0gNQogIGJlc3QgPC0gVFJVRQogIAogICNOdW1iZXIgb2YgdG9waWNzCiAgayA8LSA4CiAgCiAgI1J1biBMREEgdXNpbmcgR2liYnMgc2FtcGxpbmcKICAKICBsZGFPdXQgPC1MREEoZHRtLCBrLCBtZXRob2Q9IkdpYmJzIiwgY29udHJvbD1saXN0KG5zdGFydD1uc3RhcnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IHNlZWQsIGJlc3Q9YmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cm5pbiA9IGJ1cm5pbiwgaXRlciA9IGl0ZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbj10aGluKSkKICAjd3JpdGUgb3V0IHJlc3VsdHMKICAjZG9jcyB0byB0b3BpY3MKICBsZGFPdXQudG9waWNzIDwtIGFzLm1hdHJpeCh0b3BpY3MobGRhT3V0KSkKICB3cml0ZS5jc3YobGRhT3V0LnRvcGljcywgZmlsZSA9IHBhc3RlKCIuLi9vdXRwdXQvIiwgb2JqX25hbWUsIl9Eb2NzVG9Ub3BpY3MuY3N2Iiwgc2VwID0gIiIpKQoKICAjdG9wIHRlcm1zIGluIGVhY2ggdG9waWMKICBsZGFPdXQudGVybXMgPC0gYXMubWF0cml4KHRlcm1zKGxkYU91dCwgMjApKQogIHdyaXRlLmNzdihsZGFPdXQudGVybXMsIGZpbGUgPSBwYXN0ZSgiLi4vb3V0cHV0LyIsIG9ial9uYW1lLCAiX1RvcGljc1RvVGVybXMuY3N2Iiwgc2VwID0gIiIpKQogIAogICMgcHJvYmFiaWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCB0b3BpYyBhc3NpZ25tZW50CiAgdG9waWNQcm9iYWJpbGl0aWVzIDwtIGFzLmRhdGEuZnJhbWUobGRhT3V0QGdhbW1hKQogIHdyaXRlLmNzdih0b3BpY1Byb2JhYmlsaXRpZXMsIGZpbGUgPSBwYXN0ZSgiLi4vb3V0cHV0LyIsIG9ial9uYW1lLCAiX1RvcGljUHJvYmFiaWxpdGllcy5jc3YiLCBzZXAgPSAiIikpCiAgcmV0dXJuKGxpc3QobGRhT3V0LnRlcm1zLCB0b3BpY1Byb2JhYmlsaXRpZXMpKQp9CgpgYGAKCmBgYHtyIGVjaG89VFJVRX0KCmZlbWFsZV90b3BpY3MgPC0gTERBX3Byb2Nlc3MoZmVtYWxlX2htJGNsZWFuZWRfaG0sICJGZW1hbGUiKQoKIyBNYWxlIHRvcGljcwptYWxlX3RvcGljcyA8LSBMREFfcHJvY2VzcyhtYWxlX2htJGNsZWFuZWRfaG0sICJNYWxlIikKCmZlbWFsZV90b3BpY1Jlc3VsdHMgPC0gZmVtYWxlX3RvcGljc1tbMV1dCmZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMgPC0gZmVtYWxlX3RvcGljc1tbMl1dCm1hbGVfdG9waWNSZXN1bHRzIDwtIG1hbGVfdG9waWNzW1sxXV0KbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMgPC0gbWFsZV90b3BpY3NbWzJdXQoKYGBgCgoKYGBge3J9CmZlbWFsZV90b3BpY3MuaGFzaCA8LSBjKCJTaG9wcGluZyIsICJMaWZlIE1vbWVudHMiLCAiU3BlY2lhbCBEYXlzIENlbGVicmF0aW9uIiwiRmFtaWx5IiwiUGFydG5lciIsICJPdGhlcnMiLCAiRnJpZW5kcy9DaGlsZHJlbi9SZWxhdGl2ZXMgQWNoaWV2ZW1lbnRzIiwgIk91dGRvb3IgQWN0aXZpdGllcyIpCm1hbGVfdG9waWNzLmhhc2ggPC0gYygiU3BlY2lhbCBEYXlzIENlbGVicmF0aW9uIiwiTGlmZSBNb21lbnRzIiwiT3V0ZG9vciBBY3Rpdml0aWVzIiwiT3RoZXJzIiwiTGVpc3VyZSIsICJGYW1pbHkiLCAiV29yayBBY2hpZXZlbWVudHMiLCAiSGFiaXRzIikKCm5hbWVzKGZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMpIDwtIGZlbWFsZV90b3BpY3MuaGFzaApuYW1lcyhtYWxlX3RvcGljUHJvYmFiaWxpdGllcykgPC0gbWFsZV90b3BpY3MuaGFzaApgYGAKCkJ5IHNldHRpbmcgdGhlIG51bWJlciBvZiB0b3BpY3MgdG8gOCBpbiBhZHZhbmNlIGFuZCB0aGVuIHJ1biBMREEgdXNpbmcgR2liYnMgc2FtcGxpbmcsIHRoZSB0ZXJtcyBmcm9tIGhhcHB5IG1vbWVudCBzZW50ZW5jZXMgd2VyZSBncm91cGVkIGluIHRvIDggZ3JvdXBzIGFuZCBlYWNoIGdyb3VwIHJlcHJlc2VudCBhIHRvcGljLgoKQmFzZWQgb24gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgdGVybXMsIEkgY2F0ZWdvcml6ZWQgdGhlIHRvcGljcyBhcyB0aGUgZm9sbG93aW5nLgoKRmVtYWxlOgoKVG9waWMxOiBTaG9wcGluZwoKVG9waWMyOiBMaWZlIE1vbWVudHMKClRvcGljIDM6IFNwZWNpYWwgRGF5cyBDZWxlYnJhdGlvbgoKVG9waWMgNDogRmFtaWx5CgpUb3BpYyA1OiBQYXJ0bmVyCgpUb3BpYyA2OiBPdGhlcnMKClRvcGljIDc6IEZyaWVuZHMvQ2hpbGRyZW4vUmVsYXRpdmVzIEFjaGlldmVtZW50cwoKVG9waWMgODogT3V0ZG9vciBBY3Rpdml0aWVzCgoKTWFsZToKClRvcGljIDE6IFNwZWNpYWwgRGF5cyBDZWxlYnJhdGlvbgoKVG9waWMgMjogTGlmZSBNb21lbnRzCgpUb3BpYyAzOiBPdXRkb29yIEFjdGl2aXRpZXMKClRvcGljIDQ6IE90aGVycwoKVG9waWMgNTogIExlaXN1cmUKClRvcGljIDY6IEZhbWlseQoKVG9waWMgNzogV29yayBBY2hpZXZlbWVudHMKClRvcGljIDg6IEhhYml0cwoKQ29tcGFyaW5nIHdpdGggdG9waWMgcmVzdWx0cyB3ZSBnb3QgZnJvbSB0b3BpYyBtb2RlbGxpbmcsIHRoZXJlIGFyZSBzZXZlcmFsIGNvbW1vbiB0b3BpY3MgZm9yIGZlbWFsZSBhbmQgbWFsZVtMaWZlIE1vbWVudHMsIFNwZWNpYWwgRGF5cyBDZWxlYnJhdGlvbiwgRmFtaWx5LCBPdXRkb29yIEFjdGl2aXRpZXMgYW5kIE90aGVyc10uIFRoZXNlIGNvbW1vbiB0b3BpY3MgYXJlIHJlYXNvbmFibGUuIOKAnEZhbWlseeKAnSBmb3IgZXhhbXBsZSwgY291bGQgZ2l2ZSB1cyBzdHJvbmcgc3VwcG9ydCBhbmQgbG92ZSBzbyB0aGF0IGl0IGNhbiBwcm92aWRlIGh1bWFucyB3aXRoIGdyZWF0IGhhcHBpbmVzcyB3aXRoIG5vdCBkb3VidC4gRXhjZXB0IGZvciB0aGVzZSBjb21tb24gdG9waWNzLCBmZW1hbGUgdGVuZCB0byBnYWluIGhhcHBpbmVzcyBmcm9tIOKAnFNob3BwaW5n4oCdLCDigJxQYXJ0bmVy4oCdIGFuZCDigJxGcmllbmRzL0NoaWxkcmVuL1JlbGF0aXZlcyBBY2hpZXZlbWVudHPigJ0gd2hpbGUgbWFsZSB0ZW5kIHRvIGdhaW4gaGFwcGluZXNzIGZyb20g4oCcTGVpc3VyZeKAnSwg4oCcV29yayBBY2hpZXZlbWVudHPigJ0gYW5kIOKAnEhhYml0c+KAnS4gVGhlIGRpZmZlcmVudCBzb3VyY2VzIGZvciBoYXBwaW5lc3MgYXJpc2UgYW5kIGxldOKAmXMgbW92ZSBvbiB0byBmaW5kIG91dCBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGRpZmZlcmVuY2UuCgoKV2hpbGUgZmVtYWxlIGFuZCBtYWxlIGdhaW4gaGFwcGluZXNzIGZyb20gcmVsYXRpdmVseSBkaWZmZXJlbnQgc291cmNlcywgd2hpY2ggdHlwZSBvZiBzb3VyY2VzIHdvdWxkIGJlIG1vcmUgZ2VuZXJhbD8gSW4gb3RoZXIgd29yZHMsIHdoaWNoIGFyZSBob3QgaGFwcHkgdG9waWNzIGZvciBmZW1hbGUgYW5kIG1hbGU/CgoKCiMjIyBBbW9uZyB0aGVzZSBoYXBweSBzb3VyY2VzLCB3aGljaCBpcyBtb3JlIGNvbW1vbj8gCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgZ2VuZXJhdGUgaGVhdG1hcCBmb3IgZmVtYWxlCmhlYXRtYXAuMihhcy5tYXRyaXgoZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllc1tzYW1wbGUoMTpucm93KGZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMpLCAyMCksIF0pLCBSb3d2ID0gRkFMU0UsCiAgICAgICAgICBzY2FsZSA9ICJyb3ciLCBrZXkgPSBGLAogICAgICAgICAgY29sID0gYmx1ZXJlZCgxMDApLCAKICAgICAgICAgIGNleFJvdyA9IDAuNSwKICAgICAgICAgIGNleENvbCA9IDAuOSwKICAgICAgICAgIG1hcmdpbnMgPSBjKDgsOCksCiAgICAgICAgICB0cmFjZSA9ICJub25lIiwKICAgICAgICAgIGRlbnNpdHkuaW5mbyA9ICJub25lIikKCmBgYAoKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBnZW5lcmF0ZSBoZWF0bWFwIGZvciBtYWxlCmhlYXRtYXAuMihhcy5tYXRyaXgobWFsZV90b3BpY1Byb2JhYmlsaXRpZXNbc2FtcGxlKDE6bnJvdyhtYWxlX3RvcGljUHJvYmFiaWxpdGllcyksIDIwKSxdKSwgUm93diA9IEZBTFNFLAogICAgICAgICAgc2NhbGUgPSAicm93Iiwga2V5ID0gRiwKICAgICAgICAgIGNvbCA9IGJsdWVyZWQoMTAwKSwgCiAgICAgICAgICBjZXhSb3cgPSAwLjUsCiAgICAgICAgICBjZXhDb2wgPSAwLjksCiAgICAgICAgICBtYXJnaW5zID0gYyg4LDgpLAogICAgICAgICAgdHJhY2UgPSAibm9uZSIsCiAgICAgICAgICBkZW5zaXR5LmluZm8gPSAibm9uZSIpCgpgYGAKCkkgcmFuZG9tbHkgcGlja2VkIDIwIHJlc3BvbnNlcyBmcm9tIGVhY2ggZ3JvdXAoZmVtYWxlIGFuZCBtYWxlKSBhbmQgcGxvdHRlZCBoZWF0IG1hcHMuIFJlZCBjb2xvciBpbmRpY2F0ZXMgdGhlIGhhcHB5IG1vbWVudCBpcyBtb3JlIHJlbGF0ZWQgdG8gdGhhdCB0b3BpYy4gQmFzZWQgb24gdGhlIGhlYXRtYXAgZm9yIGZlbWFsZSwgd2UgY291bGQgZWFzaWx5IG5vdGljZSB0aGF0IHRoZSB0b3BpYyDigJxQYXJ0bmVy4oCdIGhhcyB0aGUgbW9zdCBibG9ja3Mgb2YgcmVkIGFuZCB0aGVuIOKAnFNob3BwaW5n4oCdIGFuZCDigJxGYW1pbHnigJ0uIFRoaXMgcmVzdWx0IHNob3dzIHRoYXQgaW4gZ2VuZXJhbCwgZmVtYWxlIHRlbmQgdG8gb2J0YWluIG11Y2ggaGFwcGluZXNzIGZyb20gdGhlaXIgcGFydG5lcihib3lmcmllbmQsIGh1c2JhbmQpLiBUaGlzIGlzIHJlYXNvbmFibGUgc2luY2UgdGhlIGRpZmZlcmVudCBwaHlzaWNhbCBzdHJ1Y3R1cmVzIGJldHdlZW4gZmVtYWxlIGFuZCBtYWxlIGxlYWQgdG8gZ2VuZXJhbGx5IGRpZmZlcmVudCBzZW5zaXRpdml0eSB0byBlbW90aW9ucy4gRmVtYWxlIHRlbmRzIHRvIGJlIG1vcmUgc2Vuc2l0aXZlIGluIGVtb3Rpb24gYW5kIHRodXMgdGhpcyBpcyB0aGUgcHJvYmFibGUgcmVhc29uIHdoeSBpbnRpbWF0ZSByZWxhdGlvbnMgd291bGQgcGxheSBzaWduaWZpY2FudCByb2xlLiBJbiB0aGlzIGNhc2UsIGludGltYXRlIHJlbGF0aW9ucyBjb3VsZCBiZSBhIG1vcmUgZ2VuZXJhbCBoYXBwaW5lc3Mgc291cmNlIHRoYW4gb3RoZXJzLiBPdGhlciB0aGFuIOKAnFBhcnRuZXLigJ0sIGdvaW5nIGZvciBzaG9wcGluZyBhbmQgc3BlbmRpbmcgdGltZSB3aXRoIGZhbWlseSBjYW4gYWxzbyBiZSB0d28gY29tbW9uIHNvdXJjZXMgb2YgaGFwcGluZXNzIGZvciBmZW1hbGUuIAoKRm9yIG1hbGUsIOKAnExlaXN1cmXigJ0gaXMgdGhlIG1vc3QgY29tbW9uIGhhcHB5IHNvdXJjZS4gSW5kZWVkLCBsZWlzdXJlIHRpbWUgc3VjaCBhcyBzcGVuZCBhIGRheSB3aXRoIG5vIHdvcmsgYXQgaG9tZSBhbmQgZ2V0IGdvb2QgcmVzdCB0ZW5kIHRvIGJlIHJlYWxseSByZWxheGluZywgZXNwZWNpYWxseSBmb3IgbWFsZS4gQmVzaWRlcywgZG9pbmcgc29tZXRoaW5nIHRoZXkgbGlrZShIYWJpdHMpLCBqb2luaW5nIG91dGRvb3IgYWN0aXZpdGllcyhPdXRkb29yIEFjdGl2aXRpZXMpIGFuZCBhY2NvbXBsaXNoIHNvbWUgZ29hbHMgYXQgd29yZCggV29yayBBY2hpZXZlbWVudHMpIGFyZSBhbHNvIHBvcHVsYXIgaGFwcGluZXNzIHNvdXJjZXMgZm9yIG1hbGUuIAoKCgojIEhvdyBoYXBweSBtb21lbnRzIGNoYW5nZSBiZWZvcmUgYW5kIGFmdGVyIG1hcnJpYWdlIGZvciBmZW1hbGUgYW5kIG1hbGU/CgpXb3VsZCBtYXJyaWFnZSBhZmZlY3Qgb3VyIGhhcHB5IG1vbWVudHM/IAoKIyMjIEJhciBQbG90IC0gU2luZ2xlIEZlbWFsZSBhbmQgTWFsZSBIYXBweSBNb21lbnRzCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBUb3AgMTAgd29yZHMgYmFyIHBsb3RzIGZvciBzaW5nbGUgZmVtYWxlIGFuZCBtYWxlCnNpbmdsZV9mZW1hbGVfd29yZHMgPC0gZmVtYWxlX3dvcmRzW3doaWNoKGZlbWFsZV93b3JkcyRtYXJpdGFsID09InNpbmdsZSIpLCBdCnNpbmdsZV9mZW1hbGVfd29yZF9jb3VudCA8LSBzaW5nbGVfZmVtYWxlX3dvcmRzICU+JQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQoKCnNpbmdsZV9tYWxlX3dvcmRzIDwtIG1hbGVfd29yZHNbd2hpY2gobWFsZV93b3JkcyRtYXJpdGFsID09InNpbmdsZSIpLCBdCnNpbmdsZV9tYWxlX3dvcmRfY291bnQgPC0gc2luZ2xlX21hbGVfd29yZHMgJT4lCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpCgpzZmIgPC0gZ2dwbG90KGRhdGEgPSBzaW5nbGVfZmVtYWxlX3dvcmRfY291bnRbMToxMCwgXSwgYWVzKHggPSByZW9yZGVyKHdvcmQsbiksIHkgPSBuKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgY29vcmRfZmxpcCgpKwogIHhsYWIoIlNpbmdsZSBGZW1hbGUiKQoKc21iIDwtIGdncGxvdChkYXRhID0gc2luZ2xlX21hbGVfd29yZF9jb3VudFsxOjEwLCBdLCBhZXMoeCA9IHJlb3JkZXIod29yZCxuKSwgeSA9IG4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBjb29yZF9mbGlwKCkgKwogIHhsYWIoIlNpbmdsZSBNYWxlIikKZ3JpZC5hcnJhbmdlKHNmYiwgc21iKQoKYGBgCgoKIyMgQmFyIFBsb3QgLSBNYXJyaWVkIEZlbWFsZSBhbmQgTWFsZSBIYXBweSBNb21lbnRzCmBgYHtyIGVjaG89RkFMU0V9CiMgVG9wIDEwIHdvcmRzIGJhciBwbG90cyBmb3IgbWFycmllZCBmZW1hbGUgYW5kIG1hbGUKbWFycmllZF9mZW1hbGVfd29yZHMgPC0gZmVtYWxlX3dvcmRzW3doaWNoKGZlbWFsZV93b3JkcyRtYXJpdGFsID09Im1hcnJpZWQiKSwgXQptYXJyaWVkX2ZlbWFsZV93b3JkX2NvdW50IDwtIG1hcnJpZWRfZmVtYWxlX3dvcmRzICU+JQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQoKbWFycmllZF9tYWxlX3dvcmRzIDwtIG1hbGVfd29yZHNbd2hpY2gobWFsZV93b3JkcyRtYXJpdGFsID09Im1hcnJpZWQiKSwgXQptYXJyaWVkX21hbGVfd29yZF9jb3VudCA8LSBtYXJyaWVkX21hbGVfd29yZHMgJT4lCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpCgptZmIgPC0gZ2dwbG90KGRhdGEgPSBtYXJyaWVkX2ZlbWFsZV93b3JkX2NvdW50WzE6MTAsIF0sIGFlcyh4ID0gcmVvcmRlcih3b3JkLG4pLCB5ID0gbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGNvb3JkX2ZsaXAoKSsKICB4bGFiKCJNYXJyaWVkIEZlbWFsZSIpCgptbWIgPC0gZ2dwbG90KGRhdGEgPSBtYXJyaWVkX21hbGVfd29yZF9jb3VudFsxOjEwLCBdLCBhZXMoeCA9IHJlb3JkZXIod29yZCxuKSwgeSA9IG4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBjb29yZF9mbGlwKCkgKwogIHhsYWIoIk1hcnJpZWQgTWFsZSIpCmdyaWQuYXJyYW5nZShtZmIsIG1tYikKYGBgCgoKQ29tcGFyaW5nIGJldHdlZW4gc2luZ2xlIGFuZCBtYXJyaWVkIGZlbWFsZSBhbmQgbWFsZSBoYXBweSBtb21lbnRzIHdvcmRzIGJhciBwbG90cywgd2UgY291bGQgbm90aWNlIHRoYXQgcGFydG5lciByb2xlIG5hbWVzIGNoYW5nZSBhbmQg4oCcZGF1Z2h0ZXLigJ0sIOKAnHNvbuKAnSBhbmQg4oCcaG9tZeKAnSBiZWNvbWUgbW9yZSBmcmVxdWVudCB3b3Jkcy4gV2UgY291bGQgdGhlbiByZWFzb25hYmxlIGd1ZXNzIHRoYXQgYWZ0ZXIgbWFycmlhZ2UsIGZhbWlseSBhbmQgZmFtaWx5IG1lbWJlcnMgY291bGQgYmUgYSBtb3JlIGNvbW1vbiBzb3VyY2Ugb2YgaGFwcGluZXNzIGNvbXBhcmluZyB3aXRoIHNpbmdsZSBwZXJzb24uIFdvdWxkIHRoaXMgYmUgYXBwbGllZCB0byBib3RoIG1hbGUgYW5kIGZlbWFsZT8gTGV04oCZcyBjaGVjayBvdXQgdGhlIGhlYXBtYXBzIGNvbXBhcmlzb24gYmV0d2VlbiBmZW1hbGUgYW5kIG1hbGUuCgoKIyMjIEhlYXQgbWFwcwoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEhlYXQgbWFwIGZvciBzaW5nbGUgZmVtYWxlCnNpbmdsZV9mZW1hbGVfdG9waWNQcm9iYWJpbGl0aWVzIDwtIGZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXNbd2hpY2goZmVtYWxlX2htJG1hcml0YWwgPT0gInNpbmdsZSIpLCBdCmhlYXRtYXAuMihhcy5tYXRyaXgoc2luZ2xlX2ZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXNbc2FtcGxlKDE6bnJvdyhzaW5nbGVfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllcyksIDIwKSwgXSksIAogICAgICAgICAgUm93diA9IEZBTFNFLAogICAgICAgICAgc2NhbGUgPSAicm93Iiwga2V5ID0gRiwKICAgICAgICAgIGNvbCA9IGJsdWVyZWQoMTAwKSwgCiAgICAgICAgICBjZXhSb3cgPSAwLjUsCiAgICAgICAgICBjZXhDb2wgPSAwLjksCiAgICAgICAgICBtYXJnaW5zID0gYyg4LDgpLAogICAgICAgICAgdHJhY2UgPSAibm9uZSIsCiAgICAgICAgICBkZW5zaXR5LmluZm8gPSAibm9uZSIpCgpgYGAKCgoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEhlYXQgbWFwIGZvciBtYXJyaWVkIGZlbWFsZQptYXJyaWVkX2ZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMgPC0gZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllc1t3aGljaChmZW1hbGVfaG0kbWFyaXRhbCA9PSAibWFycmllZCIpLCBdCmhlYXRtYXAuMihhcy5tYXRyaXgobWFycmllZF9mZW1hbGVfdG9waWNQcm9iYWJpbGl0aWVzW3NhbXBsZSgxOm5yb3cobWFycmllZF9mZW1hbGVfdG9waWNQcm9iYWJpbGl0aWVzKSwgMjApLCBdKSwgCiAgICAgICAgICBSb3d2ID0gRkFMU0UsCiAgICAgICAgICBzY2FsZSA9ICJyb3ciLCBrZXkgPSBGLAogICAgICAgICAgY29sID0gYmx1ZXJlZCgxMDApLCAKICAgICAgICAgIGNleFJvdyA9IDAuNSwKICAgICAgICAgIGNleENvbCA9IDAuOSwKICAgICAgICAgIG1hcmdpbnMgPSBjKDgsOCksCiAgICAgICAgICB0cmFjZSA9ICJub25lIiwKICAgICAgICAgIGRlbnNpdHkuaW5mbyA9ICJub25lIikKCmBgYAoKT25lIGludGVyZXN0aW5nIHJlc3VsdCBpcyBhYm91dCDigJxTaG9wcGluZ+KAnS4g4oCcU2hvcHBpbmfigJ0gc2VlbXMgdG8gYmUgdGhlIG1vc3QgZ2VuZXJhbCBoYXBweSB0b3BpYyBmb3Igc2luZ2xlIGZlbWFsZS4gV2hpbGUgZm9yIG1hcnJpZWQgZmVtYWxlLCDigJxTaG9wcGluZ+KAnSBzZWVtcyB0byBiZSBtdWNoIGxlc3MgYXR0cmFjdGl2ZS4gVGhpcyBmaW5kaW5nIGlzIGludGVyZXN0aW5nIHNpbmNlIHNob3BwaW5nIHNob3VsZCBiZSBpbiBnZW5lcmFsIG9uZSBvZiB0aGUgaG90IHRvcGljIGZvciBmZW1hbGUuIFdoYXQgbGVhZHMgdG8gdGhpcyBjaGFuZ2UgaXMgcHJvYmFibHkgYWZ0ZXIgbWFycmlhZ2UsIGZlbWFsZSB0ZW5kcyB0byBjYXJlIG1vcmUgYWJvdXQgdGhlaXIgZmFtaWx5IGFuZCBlc3BlY2lhbGx5IGNoaWxkcmVuIGlmIHRoZXkgaGF2ZS4gQ29tcGFyaW5nIHdpdGggbGlmZSB3aGVuIHRoZXkgYXJlIHNpbmdsZSwgdGhleSBoYXZlIGxlc3MgZnJlZSB0aW1lIGZvciBsZWlzdXJlIGFuZCBhbHNvIHByb2JhYmx5IGxlc3MgbW9uZXkgdG8gZGV2b3RlIG9uIHRoZW1zZWx2ZXMuIFRoaXMgYWxzbyBleHBsYWlucyB3aHkg4oCcRnJpZW5kcy9DaGlsZHJlbi9SZWxhdGl2ZXMgQWNoaWV2ZW1lbnRz4oCdIGFuZCDigJxQYXJ0bmVy4oCdIGJlY29tZSBob3QgdG9waWNzIGZvciBtYXJyaWVkIGZlbWFsZS4gCgoKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBIZWF0IG1hcCBmb3Igc2luZ2xlIG1hbGUKc2luZ2xlX21hbGVfdG9waWNQcm9iYWJpbGl0aWVzIDwtIG1hbGVfdG9waWNQcm9iYWJpbGl0aWVzW3doaWNoKG1hbGVfaG0kbWFyaXRhbCA9PSAic2luZ2xlIiksIF0KaGVhdG1hcC4yKGFzLm1hdHJpeChzaW5nbGVfbWFsZV90b3BpY1Byb2JhYmlsaXRpZXNbc2FtcGxlKDE6bnJvdyhzaW5nbGVfbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMpLCAyMCksIF0pLCAKICAgICAgICAgIFJvd3YgPSBGQUxTRSwKICAgICAgICAgIHNjYWxlID0gInJvdyIsIGtleSA9IEYsCiAgICAgICAgICBjb2wgPSBibHVlcmVkKDEwMCksIAogICAgICAgICAgY2V4Um93ID0gMC41LAogICAgICAgICAgY2V4Q29sID0gMC45LAogICAgICAgICAgbWFyZ2lucyA9IGMoOCw4KSwKICAgICAgICAgIHRyYWNlID0gIm5vbmUiLAogICAgICAgICAgZGVuc2l0eS5pbmZvID0gIm5vbmUiKQpgYGAKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBIZWF0IG1hcCBmb3IgbWFycmllZCBtYWxlCm1hcnJpZWRfbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMgPC0gbWFsZV90b3BpY1Byb2JhYmlsaXRpZXNbd2hpY2gobWFsZV9obSRtYXJpdGFsID09ICJtYXJyaWVkIiksIF0KaGVhdG1hcC4yKGFzLm1hdHJpeChtYXJyaWVkX21hbGVfdG9waWNQcm9iYWJpbGl0aWVzW3NhbXBsZSgxOm5yb3cobWFycmllZF9tYWxlX3RvcGljUHJvYmFiaWxpdGllcyksIDIwKSwgXSksIAogICAgICAgICAgUm93diA9IEZBTFNFLAogICAgICAgICAgc2NhbGUgPSAicm93Iiwga2V5ID0gRiwKICAgICAgICAgIGNvbCA9IGJsdWVyZWQoMTAwKSwgCiAgICAgICAgICBjZXhSb3cgPSAwLjUsCiAgICAgICAgICBjZXhDb2wgPSAwLjksCiAgICAgICAgICBtYXJnaW5zID0gYyg4LDgpLAogICAgICAgICAgdHJhY2UgPSAibm9uZSIsCiAgICAgICAgICBkZW5zaXR5LmluZm8gPSAibm9uZSIpCmBgYAoKCkZvciBtYWxlLCB0aGUgY2hhbmdlIGluIGhhcHB5IHRvcGljcyBpcyByZWxhdGl2ZWx5IGxlc3Mgb2J2aW91cy4gV2UgY291bGQgY2F0Y2ggdGhlIGluY3JlYXNlIGluIGhhcHBpbmVzcyByZWxhdGVkIHdpdGgg4oCcV29yayBBY2hpZXZlbWVudOKAnSBmb3IgbWFycmllZCBtYWxlLiBPbmUgcHJvYmFibHkgcmVhc29uIGZvciBleHBsYWluaW5nIHRoaXMgY2hhbmdlIGlzIHRoYXQgYWZ0ZXIgbWFycmlhZ2UsIG1hbGUgdGVuZHMgdG8gZmVlbCBtb3JlIHByZXNzdXJlIGFuZCBoYXZlIG1vcmUgcmVzcG9uc2liaWxpdGllcyBvbiBmYW1pbHkuIENvbXBhcmluZyB3aXRoIHNpbmdsZSBwZXJpb2QsIGFjY29tcGxpc2htZW50cyBpbiB3b3JrIHdvdWxkIGJlIG1vcmUgc2lnbmlmaWNhbnQgc2luY2UgdGhlc2UgY291bGQgaW5kaWNhdGUgYSBiZXR0ZXIgc3VwcG9ydCBmb3IgdGhlaXIgZmFtaWx5LiBUaGVyZWZvcmUsIGl0IHdvdWxkIGJlIHJlYXNvbmFibGUgdG8gY29uc2lkZXIg4oCcV29yayBBY2hpZXZlbWVudHPigJwgYXMgYSBob3QgaGFwcGluZXNzIHRvcGljIGFmdGVyIG1hcnJpYWdlLiAKCgoKIyBEbyBoYXBweSB0b3BpY3MgZGlmZmVyZW50IGFtb25nIGRpZmZlcmVudCBhZ2UgcmFuZ2VzIGZvciBmZW1hbGUgYW5kIG1hbGU/CgpXaGlsZSB5b3UgbWF5IGFsc28gYmUgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHBlb3BsZSB3aXRoIGRpZmZlcmVudCBhZ2UgdGVuZHMgdG8gZ2FpbiBoYXBwaW5lc3MgZnJvbSBkaWZmZXJlbnQgdG9waWNzLiBXb3VsZCB0aGlzIGJlIHRydWUgZm9yIGJvdGggZmVtYWxlIGFuZCBtYWxlPz8gCgojIyBDbHVzdGVyIFRvcGljcyBieSBBZ2UgZm9yIEZlbWFsZQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIERhdGEgZm9ybWF0dGluZyBhbmQgcHJlcGFyYXRpb24gCgojIGNvcnJlY3QgdHlwaW5nIGVycm9ycwpmZW1hbGVfaG1bd2hpY2goZmVtYWxlX2htJGFnZSA9PSAiMyIgfCBmZW1hbGVfaG0kYWdlID09ICIzLjAiKSwgXSRhZ2UgPC0gIjMwIgoKZmVtYWxlX2htW3doaWNoKGZlbWFsZV9obSRhZ2UgPT0gMjI3KSwgXSRhZ2UgPC0gMjcKIyBmb3JtYXQgYWdlIHRvIG51bWJlcnMgb25seSAoZWcgMzAgaW5zdGVhZCBvZiAzMC4wKQpmZW1hbGVfaG0kYWdlIDwtIHN1YnN0cihmZW1hbGVfaG0kYWdlLCAxLCAyKQoKCmFnZV9mZW1hbGVfdG9waWNQcm9iYWJpbGl0aWVzIDwtIGNiaW5kKGZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMsIGZlbWFsZV9obSRhZ2UpCgpjb2xuYW1lcyhhZ2VfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllcylbbmNvbChhZ2VfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllcyldIDwtICJhZ2UiCgphZ2VfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllczwtYWdncmVnYXRlKGFnZV9mZW1hbGVfdG9waWNQcm9iYWJpbGl0aWVzWzE6OF0sIGxpc3QoYWdlX2ZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMkYWdlKSwgbWVhbikKCmBgYAoKYGBge3IgZWNobz1UUlVFfQoKIyBDbHVzdGVyIHRvcGljcyBieSBhZ2UgZm9yIGZlbWFsZQpmZW1hbGVfY2x1c3Rlcl9kYXRhIDwtIGFzLm1hdHJpeChhZ2VfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllc1ssLTFdKQpyb3duYW1lcyhmZW1hbGVfY2x1c3Rlcl9kYXRhKSA8LSBhZ2VfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllc1ssMV0KZmVtYWxlX2ZpdCA8LSBrbWVhbnMoZmVtYWxlX2NsdXN0ZXJfZGF0YSwgaXRlci5tYXggPSAyMDAsIDQpCmZ2aXpfY2x1c3RlcihmZW1hbGVfZml0LCAKICAgICAgICAgICAgIHN0YW5kID0gRiwgCiAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICBkYXRhID0gZmVtYWxlX2NsdXN0ZXJfZGF0YSwgCiAgICAgICAgICAgICB4bGFiID0gIiIsIHlsYWIgPSAiIiwgeGF4dCA9ICJuIiwKICAgICAgICAgICAgIHNob3cuY2x1c3QuY2VudCA9IEZBTFNFKQpgYGAKCgojIyBDbHVzdGVyIFRvcGljcyBieSBBZ2UgZm9yIE1hbGUKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBEYXRhIGZvcm1hdHRpbmcgYW5kIHByZXBhcmF0aW9uIAoKIyBjb3JyZWN0IHR5cGluZyBlcnJvcnMKbWFsZV9obVt3aGljaChtYWxlX2htJGFnZSA9PSAiMiIgfCBtYWxlX2htJGFnZSA9PSAiMi4wIiksIF0kYWdlIDwtICIyMCIKCm1hbGVfaG1bd2hpY2gobWFsZV9obSRhZ2UgPT0gMyksIF0kYWdlIDwtIDMwCiMgZm9ybWF0IGFnZSB0byBudW1iZXJzIG9ubHkgKGVnIDMwIGluc3RlYWQgb2YgMzAuMCkKbWFsZV9obSRhZ2UgPC0gc3Vic3RyKG1hbGVfaG0kYWdlLCAxLCAyKQoKYWdlX21hbGVfdG9waWNQcm9iYWJpbGl0aWVzIDwtIGNiaW5kKG1hbGVfdG9waWNQcm9iYWJpbGl0aWVzLCBtYWxlX2htJGFnZVstMV0pCmNvbG5hbWVzKGFnZV9tYWxlX3RvcGljUHJvYmFiaWxpdGllcylbbmNvbChhZ2VfbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMpXSA8LSAiYWdlIgoKYWdlX21hbGVfdG9waWNQcm9iYWJpbGl0aWVzPC1hZ2dyZWdhdGUobWFsZV90b3BpY1Byb2JhYmlsaXRpZXNbMTo4XSwgbGlzdChhZ2VfbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMkYWdlKSwgbWVhbikKYGBgCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgQ2x1c3RlciB0b3BpY3MgYnkgYWdlIGZvciBtYWxlCm1hbGVfY2x1c3Rlcl9kYXRhIDwtIGFzLm1hdHJpeChhZ2VfbWFsZV90b3BpY1Byb2JhYmlsaXRpZXNbLC0xXSkKcm93bmFtZXMobWFsZV9jbHVzdGVyX2RhdGEpIDwtIGFnZV9tYWxlX3RvcGljUHJvYmFiaWxpdGllc1ssMV0KbWFsZV9maXQgPC0ga21lYW5zKG1hbGVfY2x1c3Rlcl9kYXRhLCBpdGVyLm1heCA9IDIwMCwgNCkKZnZpel9jbHVzdGVyKG1hbGVfZml0LCAKICAgICAgICAgICAgIHN0YW5kID0gRiwgCiAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICBkYXRhID0gbWFsZV9jbHVzdGVyX2RhdGEsIAogICAgICAgICAgICAgeGxhYiA9ICIiLCB5bGFiID0gIiIsIHhheHQgPSAibiIsCiAgICAgICAgICAgICBzaG93LmNsdXN0LmNlbnQgPSBGQUxTRSkKYGBgCgoKQmFzZWQgb24gdGhlIGNsdXN0ZXJpbmcgcmVzdWx0IGZvciBmZW1hbGUsIHdlIGNvdWxkIGNsZWFybHkgbm90aWNlIHRoZXJlIGFyZSBmb3VyIGNsdXN0ZXJzIGFuZCB0aGVyZSBpcyBhIHNtYWxsIG92ZXJsYXAgYmV0d2VlbiB0d28gY2x1c3RlcnMuIEZvciBjbHVzdGVyIDEsIGl0IGNvbnRhaW5zIG1vc3RseSBwb2ludHMgd2l0aCB5b3VuZ2VyIGFnZS4gVGhlIGNsdXN0ZXIgMiBjb250YWlucyBhZ2Ugd2l0aCBtb3N0IHBvaW50cyBiZWxvbmdzIHRvIDQwcywgNTBzIGFuZCA2MHMuIFdoaWxlIGZvciB0aGUgY2x1c3RlciByZXN1bHQgZm9yIG1hbGUsIHRoZSBvdmVybGFwIGlzIGEgc2VyaW91cyBpc3N1ZSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm90IGEgY2xlYXIgZGlmZmVyZW5jZSBpbiBoYXBweSB0b3BpY3MgZm9yIG1hbGUgd2l0aCBkaWZmZXJlbnQgYWdlIHJhbmdlLiAKCgoKIyBEbyBoYXBweSB0b3BpY3MgZGlmZmVyZW50IGFtb25nIGRpZmZlcmVudCByZWdpb25zIGZvciBmZW1hbGUgYW5kIG1hbGU/CgoKYGBge3IgZWNobz1UUlVFfQoKY291bnRyeV9mZW1hbGVfdG9waWNQcm9iYWJpbGl0aWVzIDwtIGNiaW5kKGZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMsIGNvdW50cnljb2RlKHNvdXJjZXZhciA9IGZlbWFsZV9obSRjb3VudHJ5LCAiaXNvM2MiLCAiY291bnRyeS5uYW1lIikpCmNvbG5hbWVzKGNvdW50cnlfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllcylbbmNvbChjb3VudHJ5X2ZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMpXSA8LSAiY291bnRyeSIKCmNvdW50cnlfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllczwtYWdncmVnYXRlKGNvdW50cnlfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllc1sxOjhdLCBsaXN0KGNvdW50cnlfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllcyRjb3VudHJ5KSwgbWVhbikKYGBgCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgQ2x1c3RlciB0b3BpY3MgYnkgY291bnRyeSBmb3IgZmVtYWxlCmZlbWFsZV9jbHVzdGVyX2RhdGEgPC0gYXMubWF0cml4KGNvdW50cnlfZmVtYWxlX3RvcGljUHJvYmFiaWxpdGllc1ssLTFdKQpyb3duYW1lcyhmZW1hbGVfY2x1c3Rlcl9kYXRhKSA8LSBjb3VudHJ5X2ZlbWFsZV90b3BpY1Byb2JhYmlsaXRpZXNbLDFdCmZlbWFsZV9maXQgPC0ga21lYW5zKGZlbWFsZV9jbHVzdGVyX2RhdGEsIGl0ZXIubWF4ID0gMjAwLCBuc3RhcnQgPSA1LDUpCmZ2aXpfY2x1c3RlcihmZW1hbGVfZml0LCAKICAgICAgICAgICAgIHN0YW5kID0gRiwgCiAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICBkYXRhID0gZmVtYWxlX2NsdXN0ZXJfZGF0YSwgCiAgICAgICAgICAgICB4bGFiID0gIiIsIHlsYWIgPSAiIiwgeGF4dCA9ICJuIiwKICAgICAgICAgICAgIHNob3cuY2x1c3QuY2VudCA9IEZBTFNFKQoKYGBgCgoKYGBge3IgZWNobz1UUlVFfQoKY291bnRyeV9tYWxlX3RvcGljUHJvYmFiaWxpdGllcyA8LSBjYmluZChtYWxlX3RvcGljUHJvYmFiaWxpdGllcywgY291bnRyeWNvZGUoc291cmNldmFyID0gbWFsZV9obSRjb3VudHJ5LCAiaXNvM2MiLCAiY291bnRyeS5uYW1lIilbLTFdKQpjb2xuYW1lcyhjb3VudHJ5X21hbGVfdG9waWNQcm9iYWJpbGl0aWVzKVtuY29sKGNvdW50cnlfbWFsZV90b3BpY1Byb2JhYmlsaXRpZXMpXSA8LSAiY291bnRyeSIKCmNvdW50cnlfbWFsZV90b3BpY1Byb2JhYmlsaXRpZXM8LWFnZ3JlZ2F0ZShjb3VudHJ5X21hbGVfdG9waWNQcm9iYWJpbGl0aWVzWzE6OF0sIGxpc3QoY291bnRyeV9tYWxlX3RvcGljUHJvYmFiaWxpdGllcyRjb3VudHJ5KSwgbWVhbikKYGBgCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgQ2x1c3RlciB0b3BpY3MgYnkgY291bnRyeSBmb3IgbWFsZQptYWxlX2NsdXN0ZXJfZGF0YSA8LSBhcy5tYXRyaXgoY291bnRyeV9tYWxlX3RvcGljUHJvYmFiaWxpdGllc1ssLTFdKQpyb3duYW1lcyhtYWxlX2NsdXN0ZXJfZGF0YSkgPC0gY291bnRyeV9tYWxlX3RvcGljUHJvYmFiaWxpdGllc1ssMV0KbWFsZV9maXQgPC0ga21lYW5zKG1hbGVfY2x1c3Rlcl9kYXRhLCBpdGVyLm1heCA9IDIwMCwgbnN0YXJ0ID0gNSw1KQpmdml6X2NsdXN0ZXIobWFsZV9maXQsIAogICAgICAgICAgICAgc3RhbmQgPSBGLCAKICAgICAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgICAgIGRhdGEgPSBtYWxlX2NsdXN0ZXJfZGF0YSwgCiAgICAgICAgICAgICB4bGFiID0gIiIsIHlsYWIgPSAiIiwgeGF4dCA9ICJuIiwKICAgICAgICAgICAgIHNob3cuY2x1c3QuY2VudCA9IEZBTFNFKQoKYGBgCgpIb3cgYWJvdXQgaGFwcHkgbW9tZW50cyBmb3IgZmVtYWxlIG1hbGUgZnJvbSBkaWZmZXJlbnQgcmVnaW9ucz8gVGhlIGNsdXN0ZXJpbmcgcmVzdWx0cyBzaG93cyB0aGF0IHRoZXJlIGlzIG5vIG9idmlvdXMgaGFwcHkgc291cmNlIGRpZmZlcmVuY2UgZm9yIGJvdGggZmVtYWxlIGFuZCBtYWxlLgo=